package com.meimeixia.pattern.singleton.demo3;

/**
 * 线程不安全
 * @author: t-zhijiang.zhao
 * @date: 2024/11/26 上午9:07
 */
public class Singleton2 {
    // 私有构造方法
    private Singleton2() {
    }

    // 声明Singleton类型的变量instance
    private static Singleton2 instance;

    // 对外提供访问方式
    public static Singleton2 getInstance() {
        // 判断instance是否为null，如果为null，那么说明还没有创建Singleton类的对象
        // 如果没有创建的话，那么我们就创建一个并返回；如果有创建，那么直接返回即可
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
    /*
    你觉得以上Singleton类写的有没有什么问题啊？肯定是存在问题的，如果是多线程环境下，那么就会出现线程安全问题。
    为什么这么说呢？假设现在是多线程环境，两个线程同时调用getInstance方法，线程1拿到cpu的执行权，它在调用getInstance方法时，
    首先肯定是要做一个判断的，做完判断之后，它会进入到判断里面。此时，如果线程2拿到了cpu的执行权，那么线程1就会处于等待状态，同样，
    线程2在调用getInstance方法时也是要进行判断的，你觉得线程2还能进入到判断里面吗？
    肯定能够啊！因为此时if判断条件是成立的，即instance是等于null的，这一切都是由于线程1还处于等待状态，还未执行下面的代码而导致的。也就是说，
    只要线程2获取到了cpu的执行权，那么它也会进入到判断里面。这样，以上Singleton类创建的就不是单个对象了，而是多个
    */
}
